global p
p = 0
list_yewu = []
u = 0

for i in range(13, 33):
    if i <= 23:
        p = i - 12
        for j in range(1, 13):
            if j == p:
                continue
            else:
                if j == 12:
                    for k in range(24, 33):
                        list_yewu.append([])
                        list_yewu[u].append(u)
                        list_yewu[u].append(i)
                        list_yewu[u].append(p)
                        list_yewu[u].append(j)
                        list_yewu[u].append(k)
                        u = u + 1
                else:
                    y = j + 12
                    list_yewu.append([])
                    list_yewu[u].append(u)
                    list_yewu[u].append(i)
                    list_yewu[u].append(p)
                    list_yewu[u].append(j)
                    list_yewu[u].append(y)
                    u = u + 1
    else:
        z = 12
        for k in range(13, 33):
            if k <= 23:
                list_yewu.append([])
                list_yewu[u].append(u)
                list_yewu[u].append(i)
                list_yewu[u].append(z)
                list_yewu[u].append(k - 12)
                list_yewu[u].append(k)
                u = u + 1
            else:
                if k == i:
                    continue
                else:
                    list_yewu.append([])
                    list_yewu[u].append(u)
                    list_yewu[u].append(i)
                    list_yewu[u].append(z)
                    list_yewu[u].append(k)
                    u = u + 1
list_lianlu = [[]]
list_fz = []
list_fz.append(list_yewu[0][1])
list_fz.append(list_yewu[0][2])
list_lianlu[0].append(list_yewu[0][1])
list_lianlu[0].append(list_yewu[0][2])
for i in range(0, len(list_yewu)):
    for j in range(1, len(list_yewu[i]) - 1):
        for k in range(0, len(list_fz), 2):
            if list_fz[k] == list_yewu[i][j] and list_fz[k + 1] == list_yewu[i][j + 1]:
                break
            else:
                if k < len(list_fz) - 2:
                    continue
                else:
                    list_fz.append(list_yewu[i][j])
                    list_fz.append(list_yewu[i][j + 1])
                    list_lianlu.append([])
                    list_lianlu[len(list_lianlu) - 1].append(list_yewu[i][j])
                    list_lianlu[len(list_lianlu) - 1].append(list_yewu[i][j + 1])
for i in range(0, len(list_yewu)):
    for j in range(1, len(list_yewu[i]) - 1):
        for k in range(0, len(list_fz), 2):
            if list_fz[k] == list_yewu[i][j] and list_fz[k + 1] == list_yewu[i][j + 1]:
                list_lianlu[int(k / 2)].append(list_yewu[i][0])
                break

# 目前位置，list_lianlu中前两列存放了链路元素
# list_fz存放了一维的链路，两个一跳
# 现在需要做的工作就是开始对整个业务表进行遍历了

print(list_yewu)
import gurobipy as gp
from gurobipy import *
from gurobipy import GRB

try:

    # ①创建一个模型,gurobipy.Model('模型名')
    m = gp.Model("TTE_test")

    # ②设置参数变量   x = MODEL.addVars(20, 8, vtype=gurobipy.GRB.BINARY,'C')  Cij:业务i在链路j上的发送时刻  i∈[0,20) j∈[0,8)
    C = m.addVars(range(0, 400), range(1, 60), vtype='C', name="C")

    M = m.addVar(lb=0, ub=gurobipy.GRB.INFINITY, vtype=GRB.SEMIINT, name='M')
    '''相当于一下设置了下面Z1-Z7，用Z[],表示下标'''
    Z = m.addVars(10000, vtype=GRB.BINARY, name='Z')
    m.ModelSense = GRB.MINIMIZE

    # for i in range(0, len(list_yewu)):
    #     list_obj.append(C[list_yewu[i][0], list_yewu[i][len(list_yewu[i]) - 1])
    #     m.setObjectiveN(sum(list_obj), index=0,
    #                     priority=2, abstol=0, reltol=0, name='obj1')
    #     for i in range(0, len(list_yewu)):
    #         y = y + C[list_yewu[i][0], list_yewu[i][1]]
    #     m.setObjectiveN(y, index=1,
    #                     priority=1, abstol=0, reltol=0, name='obj2')

    '''L1_7:表示在结点1到7这条链路上 简单分析，需要创建一个多维数组用来形成指定链路上的约束条件，'''
    # ④设置约束条件 #第一个元素的[7,9]是指这条路的端结点，后面开始依次代表[业务号,帧长]
    p=0
    for i in range(0, len(list_lianlu)):
        for j in range(2, len(list_lianlu[i]) - 1):
            for k in range(i + 1, len(list_lianlu[i])):
                p = p + 1
                m.addConstr(C[list_lianlu[i][j], list_lianlu[i][0]] + 1 <= C[list_lianlu[i][k], list_lianlu[0][0]] + Z[p] * M, '')
                m.addConstr(C[list_lianlu[i][k], list_lianlu[i][0]] + 1 <= C[list_lianlu[i][j], list_lianlu[0][0]] + (1 - Z[p]) * M, '')

    '''对于这个F，因为我们除了业务1和7以外只有一跳，通过的端结点是3个，我们只用的到每个业务第一段路径的时延 2.5 '''
    for i in range(0, len(list_yewu)):
        for j in range(1, len(list_yewu[i]) - 2):
            m.addConstr(C[i, list_yewu[i][j]] + 1 <= C[i, list_yewu[i][j + 1]])
        # （i+1） ：表示业务序号（行号索引从0开始）

    m.write('Test_999999_point.lp')

    # ⑤开始求解
    m.optimize()  # m == gurobipy.Model

    '''循环遍历你设置的所有变量值'''
    for v in m.getVars():
        print('%s %g' % (v.varName, v.x))

    '''一行一下输出所有设置的变量值'''
    # v = m.getVars()
    # print(v)
    print('\n---------------------------------------------')
    '''循环输出我想要的变量'''
    for i in range(1, 9):
        print(C[i, 7])

    print('\n-----------------------------------------------')
    wangzai = C[2, 7]
    print('wangzai=', C[2, 7])

    '''显示设置的一个目标，如果设置了多个目标，返回优先级最大的'''
    print('Obj1: %g' % m.objVal)  # objVal：（优化后最优的目标结果值）

    # print(m.NumObj) 输出结果为2 ，因为我们设置了两个目标函数, 序号 index=0 ,index=1
    for i in range(m.NumObj):  # 可以使用NumObj属性查询(或修改)模型中的目标数量，它的值是目标函数的数量。遍历它，得到的是一个个index的值
        m.setParam(GRB.Param.ObjNumber, i)
    print('Obj%d = ' % (i + 1), m.ObjNVal)


except gp.GurobiError as e:
    print('Error code ' + str(e.errno) + ': ' + str(e))

except AttributeError:  # 属性错误
    print('Encountered an attribute error')